å ç¢ã§ä¿¡é Œæ§ã®é«ããœãããŠã§ã¢ã®æ§ç¯ã«äžå¯æ¬ ãªãåå®å šãªãªãœãŒã¹ç®¡çãšã·ã¹ãã å²ãåœãŠåã®è©³çŽ°ãæ¢ããŸãããªãœãŒã¹ãªãŒã¯ãé²ããã³ãŒãå質ãåäžãããæ¹æ³ãåŠã³ãŸãããã
åå®å šãªãªãœãŒã¹ç®¡çïŒã·ã¹ãã å²ãåœãŠåå®è£
ãªãœãŒã¹ç®¡çã¯ãœãããŠã§ã¢éçºã«ãããŠæ¥µããŠéèŠãªåŽé¢ã§ãããç¹ã«ã¡ã¢ãªããã¡ã€ã«ãã³ãã«ããããã¯ãŒã¯ãœã±ãããããŒã¿ããŒã¹æ¥ç¶ãšãã£ãã·ã¹ãã ãªãœãŒã¹ãæ±ãå Žåã«ã¯é¡èã§ããäžé©åãªãªãœãŒã¹ç®¡çã¯ããªãœãŒã¹ãªãŒã¯ãã·ã¹ãã äžå®å®æ§ãããã«ã¯ã»ãã¥ãªãã£è匱æ§ã«ã€ãªããå¯èœæ§ããããŸããã·ã¹ãã å²ãåœãŠåã®ãããªæè¡ãéããŠå®çŸãããåå®å šãªãªãœãŒã¹ç®¡çã¯ãããã°ã©ã å ã®å¶åŸ¡ãããŒããšã©ãŒæ¡ä»¶ã«é¢ãããããªãœãŒã¹ãåžžã«æ£ããååŸããè§£æŸãããããšãä¿èšŒãã匷åãªã¡ã«ããºã ãæäŸããŸãã
åé¡ç¹ïŒãªãœãŒã¹ãªãŒã¯ãšäºæž¬äžå¯èœãªåäœ
å€ãã®ããã°ã©ãã³ã°èšèªã§ã¯ããªãœãŒã¹ã¯å²ãåœãŠé¢æ°ãã·ã¹ãã ã³ãŒã«ã䜿ã£ãŠæç€ºçã«ååŸãããŸãããã®åŸããããã®ãªãœãŒã¹ã¯å¯Ÿå¿ããè§£æŸé¢æ°ã䜿ã£ãŠæç€ºçã«è§£æŸãããªããã°ãªããŸããããªãœãŒã¹ã®è§£æŸãæ ããšããªãœãŒã¹ãªãŒã¯ãçºçããŸããæéã®çµéãšãšãã«ããããã®ãªãŒã¯ã¯ã·ã¹ãã ãªãœãŒã¹ãæ¯æžãããããã©ãŒãã³ã¹ã®äœäžãæçµçã«ã¯ã¢ããªã±ãŒã·ã§ã³ã®é害ã«ã€ãªãããŸããããã«ãäŸå€ãã¹ããŒãããããååŸãããªãœãŒã¹ãè§£æŸããã«é¢æ°ãéäžã§æ»ã£ãããããšãç¶æ³ã¯ããã«åä»ã«ãªããŸãã
以äžã®Cèšèªã®äŸã¯ãæœåšçãªãã¡ã€ã«ãã³ãã«ãªãŒã¯ã瀺ããŠããŸãã
FILE *fp = fopen("data.txt", "r");
if (fp == NULL) {
  perror("Error opening file");
  return;
}
// ãã¡ã€ã«ã«å¯Ÿããæäœãå®è¡
if (/* some condition */) {
  // ãšã©ãŒæ¡ä»¶ã ãããã¡ã€ã«ã¯éããããŠããªã
  return;
}
fclose(fp); // ãã¡ã€ã«ã¯éããããããæåãã¹ã®ã¿
ãã®äŸã§ã¯ã`fopen`ã倱æããå Žåãæ¡ä»¶ãããã¯ãå®è¡ãããå Žåããã¡ã€ã«ãã³ãã«`fp`ã¯éããããããªãœãŒã¹ãªãŒã¯ãçºçããŸããããã¯ãæåã§ã®å²ãåœãŠãšè§£æŸã«äŸåããåŸæ¥ã®ãªãœãŒã¹ç®¡çã¢ãããŒãã§ããèŠããããã¿ãŒã³ã§ãã
解決çïŒã·ã¹ãã å²ãåœãŠåãšRAII
ã·ã¹ãã å²ãåœãŠåãšRAIIïŒResource Acquisition Is InitializationïŒã€ãã£ãªã ã¯ããªãœãŒã¹ç®¡çã«å¯Ÿããå ç¢ã§åå®å šãªè§£æ±ºçãæäŸããŸããRAIIã¯ããªãœãŒã¹ã®ååŸããªããžã§ã¯ãã®ã©ã€ãã¿ã€ã ã«çµã³ã€ããããããšãä¿èšŒããŸãããªãœãŒã¹ã¯ãªããžã§ã¯ãã®æ§ç¯äžã«ååŸããããªããžã§ã¯ãã®ç Žæ£äžã«èªåçã«è§£æŸãããŸãããã®ã¢ãããŒãã¯ãäŸå€ãæ©æãªã¿ãŒã³ã®ååšäžã§ãããªãœãŒã¹ãåžžã«è§£æŸãããããšãä¿èšŒããŸãã
RAIIã®äž»èŠååïŒ
- ãªãœãŒã¹ã®ååŸïŒãªãœãŒã¹ã¯ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿å ã§ååŸãããŸãã
 - ãªãœãŒã¹ã®è§£æŸïŒãªãœãŒã¹ã¯åãã¯ã©ã¹ã®ãã¹ãã©ã¯ã¿å ã§è§£æŸãããŸãã
 - æææš©ïŒã¯ã©ã¹ããªãœãŒã¹ãææãããã®ã©ã€ãã¿ã€ã ã管çããŸãã
 
RAIIã¯ããªãœãŒã¹ç®¡çãã¯ã©ã¹å ã«ã«ãã»ã«åããããšã§ãæåã§ã®ãªãœãŒã¹è§£æŸã®å¿ èŠæ§ãæé€ãããªãœãŒã¹ãªãŒã¯ã®ãªã¹ã¯ãäœæžããã³ãŒãã®ä¿å®æ§ãåäžãããŸãã
å®è£ äŸ
C++ã®ã¹ããŒããã€ã³ã¿
C++ã¯ãã¡ã¢ãªç®¡çã®ããã«RAIIãå®è£ ããã¹ããŒããã€ã³ã¿ïŒäŸïŒ`std::unique_ptr`ã`std::shared_ptr`ïŒãæäŸããŸãããããã®ã¹ããŒããã€ã³ã¿ã¯ãã¹ã³ãŒããå€ãããšãã«ç®¡çããŠããã¡ã¢ãªãèªåçã«è§£æŸããã¡ã¢ãªãªãŒã¯ãé²ããŸããã¹ããŒããã€ã³ã¿ã¯ãäŸå€å®å šã§ã¡ã¢ãªãªãŒã¯ã®ãªãC++ã³ãŒããèšè¿°ããããã®äžå¯æ¬ ãªããŒã«ã§ãã
`std::unique_ptr`ã®äœ¿çšäŸïŒ
#include <memory>
int main() {
  std::unique_ptr<int> ptr(new int(42));
  // 'ptr' ã¯åçã«å²ãåœãŠãããã¡ã¢ãªãææããã
  // 'ptr' ãã¹ã³ãŒããå€ãããšãã¡ã¢ãªã¯èªåçã«è§£æŸãããã
  return 0;
}
`std::shared_ptr`ã®äœ¿çšäŸïŒ
#include <memory>
int main() {
  std::shared_ptr<int> ptr1(new int(42));
  std::shared_ptr<int> ptr2 = ptr1; // ptr1ãšptr2ã®äž¡æ¹ãæææš©ãå
±æããã
  // æåŸã®shared_ptrãã¹ã³ãŒããå€ãããšã¡ã¢ãªãè§£æŸãããã
  return 0;
}
C++ã§ã®ãã¡ã€ã«ãã³ãã«ã©ãããŒ
RAIIã䜿çšããŠãã¡ã€ã«ãã³ãã«ç®¡çãã«ãã»ã«åããã«ã¹ã¿ã ã¯ã©ã¹ãäœæã§ããŸãã
#include <iostream>
#include <fstream>
class FileHandler {
 private:
  std::fstream file;
  std::string filename;
 public:
  FileHandler(const std::string& filename, std::ios_base::openmode mode) : filename(filename) {
    file.open(filename, mode);
    if (!file.is_open()) {
      throw std::runtime_error("Could not open file: " + filename);
    }
  }
  ~FileHandler() {
    if (file.is_open()) {
      file.close();
      std::cout << "File " << filename << " closed successfully.\n";
    }
  }
  std::fstream& getFileStream() {
    return file;
  }
  // ã³ããŒãšã ãŒããçŠæ¢
  FileHandler(const FileHandler&) = delete;
  FileHandler& operator=(const FileHandler&) = delete;
  FileHandler(FileHandler&&) = delete;
  FileHandler& operator=(FileHandler&&) = delete;
};
int main() {
  try {
    FileHandler myFile("example.txt", std::ios::out);
    myFile.getFileStream() << "Hello, world!\n";
    // myFileãã¹ã³ãŒããå€ãããšããã¡ã€ã«ã¯èªåçã«éããããã
  } catch (const std::exception& e) {
    std::cerr << "Exception: " << e.what() << std::endl;
    return 1;
  }
  return 0;
}
ãã®äŸã§ã¯ã`FileHandler`ã¯ã©ã¹ã¯ã³ã³ã¹ãã©ã¯ã¿ã§ãã¡ã€ã«ãã³ãã«ãååŸãããã¹ãã©ã¯ã¿ã§ãããè§£æŸããŸããããã«ããã`try`ãããã¯å ã§äŸå€ãã¹ããŒãããå Žåã§ãããã¡ã€ã«ãåžžã«éããããããšãä¿èšŒãããŸãã
Rustã«ãããRAII
Rustã®æææš©ã·ã¹ãã ãšåçšãã§ãã«ãŒã¯ãã³ã³ãã€ã«æã«RAIIã®ååã匷å¶ããŸãããã®èšèªã¯ããªãœãŒã¹ãã¹ã³ãŒããå€ãããšåžžã«è§£æŸãããããšãä¿èšŒããã¡ã¢ãªãªãŒã¯ããã®ä»ã®ãªãœãŒã¹ç®¡çã®åé¡ãé²ããŸããRustã®`Drop`ãã¬ã€ãã¯ããªãœãŒã¹ã®ã¯ãªãŒã³ã¢ããããžãã¯ãå®è£ ããããã«äœ¿çšãããŸãã
struct FileGuard {
    file: std::fs::File,
    filename: String,
}
impl FileGuard {
    fn new(filename: &str) -> Result<FileGuard, std::io::Error> {
        let file = std::fs::File::create(filename)?;
        Ok(FileGuard { file, filename: filename.to_string() })
    }
}
impl Drop for FileGuard {
    fn drop(&mut self) {
        println!("ãã¡ã€ã« {} ã¯éããããŸããã", self.filename);
        // FileGuardãããããããããšããã¡ã€ã«ã¯èªåçã«éããããã
    }
}
fn main() -> Result<(), std::io::Error> {
    let _file_guard = FileGuard::new("output.txt")?;
    // ãã¡ã€ã«ã§äœãããã
    Ok(())
}
ãã®Rustã®äŸã§ã¯ã`FileGuard`ã¯`new`ã¡ãœããã§ãã¡ã€ã«ãã³ãã«ãååŸãã`FileGuard`ã€ã³ã¹ã¿ã³ã¹ããããããããïŒã¹ã³ãŒããå€ããïŒãšãã¡ã€ã«ãéããŸããRustã®æææš©ã·ã¹ãã ã¯ããã¡ã€ã«ã«å¯ŸããŠäžåºŠã«1ã€ã®ææè ããååšããªãããšãä¿èšŒããããŒã¿ç«¶åããã®ä»ã®äžŠè¡åŠçã®åé¡ãé²ããŸãã
åå®å šãªãªãœãŒã¹ç®¡çã®å©ç¹
- ãªãœãŒã¹ãªãŒã¯ã®åæžïŒRAIIã¯ãªãœãŒã¹ãåžžã«è§£æŸãããããšãä¿èšŒãããªãœãŒã¹ãªãŒã¯ã®ãªã¹ã¯ãæå°éã«æããŸãã
 - äŸå€å®å šæ§ã®åäžïŒRAIIã¯äŸå€ãçºçããå Žåã§ããªãœãŒã¹ãè§£æŸãããããšãä¿èšŒããããå ç¢ã§ä¿¡é Œæ§ã®é«ãã³ãŒãã«ã€ãªãããŸãã
 - ã³ãŒãã®ç°¡çŽ åïŒRAIIã¯æåã§ã®ãªãœãŒã¹è§£æŸã®å¿ èŠæ§ãæé€ããã³ãŒããç°¡çŽ åããŠãšã©ãŒã®å¯èœæ§ãæžãããŸãã
 - ã³ãŒãä¿å®æ§ã®åäžïŒRAIIã¯ãªãœãŒã¹ç®¡çãã¯ã©ã¹å ã«ã«ãã»ã«åããããšã§ãã³ãŒãã®ä¿å®æ§ãåäžããããªãœãŒã¹äœ¿çšã«ã€ããŠæšè«ããããã«å¿ èŠãªåŽåãåæžããŸãã
 - ã³ã³ãã€ã«æä¿èšŒïŒRustã®ãããªèšèªã¯ããªãœãŒã¹ç®¡çã«é¢ããã³ã³ãã€ã«æä¿èšŒãæäŸããã³ãŒãã®ä¿¡é Œæ§ãããã«é«ããŸãã
 
èæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
- æ éãªèšèšïŒRAIIã念é ã«çœ®ããŠã¯ã©ã¹ãèšèšããã«ã¯ããªãœãŒã¹ã®æææš©ãšã©ã€ãã¿ã€ã ãæ éã«æ€èšããå¿ èŠããããŸãã
 - 埪ç°äŸåã®åé¿ïŒRAIIãªããžã§ã¯ãéã®åŸªç°äŸåã¯ããããããã¯ãã¡ã¢ãªãªãŒã¯ã«ã€ãªããå¯èœæ§ããããŸããã³ãŒããæ éã«æ§é åããããšã§ããããã®äŸåé¢ä¿ãé¿ããŠãã ããã
 - æšæºã©ã€ãã©ãªã³ã³ããŒãã³ãã®äœ¿çšïŒC++ã®ã¹ããŒããã€ã³ã¿ã®ãããªæšæºã©ã€ãã©ãªã³ã³ããŒãã³ããæŽ»çšããŠããªãœãŒã¹ç®¡çãç°¡çŽ åãããšã©ãŒã®ãªã¹ã¯ãäœæžããŸãã
 - ã ãŒãã»ãã³ãã£ã¯ã¹ã®æ€èšïŒé«äŸ¡ãªãªãœãŒã¹ãæ±ãå Žåãæææš©ãå¹ççã«è»¢éããããã«ã ãŒãã»ãã³ãã£ã¯ã¹ã䜿çšããŸãã
 - ãšã©ãŒã®é©åãªåŠçïŒãªãœãŒã¹ååŸäžã«ãšã©ãŒãçºçããå Žåã§ããªãœãŒã¹ãè§£æŸãããããã«ãé©åãªãšã©ãŒåŠçãå®è£ ããŸãã
 
é«åºŠãªæè¡
ã«ã¹ã¿ã ã¢ãã±ãŒã¿
ã·ã¹ãã ãæäŸããããã©ã«ãã®ã¡ã¢ãªå²ãåœãŠåšãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã«é©ããªãå ŽåããããŸãããã®ãããªå Žåãã«ã¹ã¿ã ã¢ãã±ãŒã¿ã䜿çšããŠãç¹å®ã®ããŒã¿æ§é ã䜿çšãã¿ãŒã³ã«å¯ŸããŠã¡ã¢ãªå²ãåœãŠãæé©åã§ããŸããã«ã¹ã¿ã ã¢ãã±ãŒã¿ã¯RAIIãšçµ±åããããšã§ãç¹æ®ãªã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠåå®å šãªã¡ã¢ãªç®¡çãæäŸã§ããŸãã
äŸïŒæŠå¿µçãªC++ïŒïŒ
template <typename T, typename Allocator = std::allocator<T>>
class VectorWithAllocator {
private:
  std::vector<T, Allocator> data;
  Allocator allocator;
public:
  VectorWithAllocator(const Allocator& alloc = Allocator()) : allocator(alloc), data(allocator) {}
  ~VectorWithAllocator() { /* ãã¹ãã©ã¯ã¿ã¯èªåçã«std::vectorã®ãã¹ãã©ã¯ã¿ãåŒã³åºããã¢ãã±ãŒã¿ãä»ããŠè§£æŸãåŠçãã */ }
  // ... ã¢ãã±ãŒã¿ã䜿çšããVectoræäœ ...
};
確å®çãã¡ã€ãã©ã€ãŒãŒã·ã§ã³
äžéšã®ã·ããªãªã§ã¯ããªããžã§ã¯ãã®ãã¹ãã©ã¯ã¿ã«ã®ã¿äŸåããã®ã§ã¯ãªããç¹å®ã®ãªãœãŒã¹ãç¹å®ã®æç¹ã§è§£æŸãããããšãä¿èšŒããããšãéèŠã§ãã確å®çãã¡ã€ãã©ã€ãŒãŒã·ã§ã³æè¡ã¯ãæç€ºçãªãªãœãŒã¹è§£æŸãå¯èœã«ãããªãœãŒã¹ç®¡çã«å¯Ÿããããå€ãã®å¶åŸ¡ãæäŸããŸããããã¯ãè€æ°ã®ã¹ã¬ãããããã»ã¹éã§å ±æããããªãœãŒã¹ãæ±ãå Žåã«ç¹ã«éèŠã§ãã
RAIIãèªåçãªè§£æŸãåŠçããã®ã«å¯Ÿãã確å®çãã¡ã€ãã©ã€ãŒãŒã·ã§ã³ã¯æç€ºçãªè§£æŸãåŠçããŸããäžéšã®èšèª/ãã¬ãŒã ã¯ãŒã¯ã¯ãããã«é¢ããç¹å®ã®ã¡ã«ããºã ãæäŸããŸãã
èšèªããšã®èæ ®äºé
C++
- ã¹ããŒããã€ã³ã¿ïŒ`std::unique_ptr`ã`std::shared_ptr`ã`std::weak_ptr`
 - RAIIã€ãã£ãªã ïŒã¯ã©ã¹å ã«ãªãœãŒã¹ç®¡çãã«ãã»ã«åããŸãã
 - äŸå€å®å šæ§ïŒRAIIã䜿çšããŠãäŸå€ãã¹ããŒãããå Žåã§ããªãœãŒã¹ãè§£æŸãããããšãä¿èšŒããŸãã
 - ã ãŒãã»ãã³ãã£ã¯ã¹ïŒã ãŒãã»ãã³ãã£ã¯ã¹ãå©çšããŠããªãœãŒã¹ã®æææš©ãå¹ççã«è»¢éããŸãã
 
Rust
- æææš©ã·ã¹ãã ïŒRustã®æææš©ã·ã¹ãã ãšåçšãã§ãã«ãŒã¯ãã³ã³ãã€ã«æã«RAIIã®ååã匷å¶ããŸãã
 - `Drop`ãã¬ã€ãïŒ`Drop`ãã¬ã€ããå®è£ ããŠããªãœãŒã¹ã®ã¯ãªãŒã³ã¢ããããžãã¯ãå®çŸ©ããŸãã
 - ã©ã€ãã¿ã€ã ïŒã©ã€ãã¿ã€ã ã䜿çšããŠããªãœãŒã¹ãžã®åç §ãæå¹ã§ããããšãä¿èšŒããŸãã
 - ResultåïŒãšã©ãŒåŠçã«ã¯`Result`åã䜿çšããŸãã
 
Java (try-with-resources)
Javaã¯ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããŸãããç¹å®ã®ãªãœãŒã¹ïŒãã¡ã€ã«ã¹ããªãŒã ãªã©ïŒã¯ã`try-with-resources`ã¹ããŒãã¡ã³ãã䜿çšããæç€ºçãªç®¡çããäŸç¶ãšããŠæ©æµãåããŸããããã¯ãRAIIãšåæ§ã«ããããã¯ã®çµããã«ãªãœãŒã¹ãèªåçã«éããŸãã
try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}
// ããã§br.close()ãèªåçã«åŒã³åºããã
Python (withã¹ããŒãã¡ã³ã)
Pythonã®`with`ã¹ããŒãã¡ã³ãã¯ããªãœãŒã¹ãé©åã«ç®¡çãããããšãä¿èšŒããã³ã³ããã¹ããããŒãžã£ãæäŸããŸããããã¯RAIIã«äŒŒãŠããŸãããªããžã§ã¯ãã¯`__enter__`ã¡ãœãããš`__exit__`ã¡ãœãããå®çŸ©ããŠããªãœãŒã¹ã®ååŸãšè§£æŸãåŠçããŸãã
with open("example.txt", "r") as f:
    for line in f:
        print(line)
# ããã§f.close()ãèªåçã«åŒã³åºããã
ã°ããŒãã«ãªèŠç¹ãšäŸ
åå®å šãªãªãœãŒã¹ç®¡çã®ååã¯ãæ§ã ãªããã°ã©ãã³ã°èšèªããœãããŠã§ã¢éçºç°å¢ã§æ®éçã«é©çšå¯èœã§ãããã ããå ·äœçãªå®è£ ã®è©³çްããã¹ããã©ã¯ãã£ã¹ã¯ãèšèªãã¿ãŒã²ãããã©ãããã©ãŒã ã«ãã£ãŠç°ãªãå ŽåããããŸãã
äŸ1ïŒããŒã¿ããŒã¹æ¥ç¶ããŒãªã³ã°
ããŒã¿ããŒã¹æ¥ç¶ããŒãªã³ã°ã¯ãããŒã¿ããŒã¹é§ååã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžãããããã«äœ¿çšãããäžè¬çãªæè¡ã§ããæ¥ç¶ããŒã«ã¯ãè€æ°ã®ã¹ã¬ãããããã»ã¹ã«ãã£ãŠåå©çšã§ãããªãŒãã³ãªããŒã¿ããŒã¹æ¥ç¶ã®ã»ãããç¶æããŸããåå®å šãªãªãœãŒã¹ç®¡çã䜿çšããŠãããŒã¿ããŒã¹æ¥ç¶ãäžèŠã«ãªã£ããšãã«åžžã«ããŒã«ã«è¿ãããããšãä¿èšŒããæ¥ç¶ãªãŒã¯ãé²ãããšãã§ããŸãã
ãã®æŠå¿µã¯ãæ±äº¬ã§Webã¢ããªã±ãŒã·ã§ã³ãéçºããå Žåã§ãããã³ãã³ã§ã¢ãã€ã«ã¢ããªãéçºããå Žåã§ãããã¥ãŒãšãŒã¯ã§éèã·ã¹ãã ãéçºããå Žåã§ããã°ããŒãã«ã«é©çšå¯èœã§ãã
äŸ2ïŒãããã¯ãŒã¯ãœã±ãã管ç
ãããã¯ãŒã¯ãœã±ããã¯ããããã¯ãŒã¯ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ã§ããé©åãªãœã±ãã管çã¯ããªãœãŒã¹ãªãŒã¯ãé²ããæ¥ç¶ãæ£åžžã«éããããããšãä¿èšŒããããã«æ¥µããŠéèŠã§ããåå®å šãªãªãœãŒã¹ç®¡çã䜿çšããŠããšã©ãŒãäŸå€ã®ååšäžã§ãããœã±ãããäžèŠã«ãªã£ããšãã«åžžã«éããããããšãä¿èšŒã§ããŸãã
ããã¯ããã³ã¬ããŒã«ã§åæ£ã·ã¹ãã ãæ§ç¯ããå Žåã§ãããœãŠã«ã§ã²ãŒã ãµãŒããŒãæ§ç¯ããå Žåã§ããã·ãããŒã§é»æ°éä¿¡ãã©ãããã©ãŒã ãæ§ç¯ããå Žåã§ããåæ§ã«é©çšãããŸãã
çµè«
åå®å šãªãªãœãŒã¹ç®¡çãšã·ã¹ãã å²ãåœãŠåãç¹ã«RAIIã€ãã£ãªã ãä»ãããã®ã¯ãå ç¢ã§ä¿¡é Œæ§ãé«ããä¿å®æ§ã®é«ããœãããŠã§ã¢ãæ§ç¯ããããã®äžå¯æ¬ ãªæè¡ã§ãããªãœãŒã¹ç®¡çãã¯ã©ã¹å ã«ã«ãã»ã«åããã¹ããŒããã€ã³ã¿ãæææš©ã·ã¹ãã ãªã©ã®èšèªåºæã®æ©èœã掻çšããããšã§ãéçºè ã¯ãªãœãŒã¹ãªãŒã¯ã®ãªã¹ã¯ãå€§å¹ ã«åæžããäŸå€å®å šæ§ãåäžãããã³ãŒããç°¡çŽ åã§ããŸãããããã®ååãæ¡çšããããšã§ãããäºæž¬å¯èœã§å®å®ãããæçµçã«ã¯äžçäžã§ããæåãããœãããŠã§ã¢ãããžã§ã¯ãã«ã€ãªãããŸããããã¯ã¯ã©ãã·ã¥ãé¿ããããšã ãã§ã¯ãããŸãããã©ãã«ããŠããŠãŒã¶ãŒã«ä¿¡é Œæ§ã®é«ããµãŒãã¹ãæäŸãããå¹ççã§ã¹ã±ãŒã©ãã«ãªãä¿¡é Œã§ãããœãããŠã§ã¢ãäœæããããšã§ãã